﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>


////#define PRINT(X) printf(#X"= %d\n",X)
//#define PRINTMORE(Format,X) printf("The value of "#X" is "Format"\n",X)
//
//int main() {
//	//#在define中的字符串化
//	//#运算符将宏的⼀个参数转换为字符串字⾯量。
//	// 它仅允许出现在带参数的宏的替换列表中。
//	//int a = 10;
//	//PRINT(a);
//	//int b = 20;
//	//PRINT(b);
//
//	int a = 10;
//	PRINTMORE("%d", a);
//	float b = 3.14f;
//	PRINTMORE("%f", b);
//	return 0;
//}

//#define NAME(X,Y) X##Y 
//
//int main() {
//	//宏定义中##的用法
//	int ppjww = 20;
//	printf("%d\n", NAME(ppj, ww));
//	return 0;
//}

//#define CHANGE(a,b) a^b
//
//int main() {
//	//奇数位与偶数位交换
//	int a = 0b1110;
//	int b = 0xFFFF;
//	a = CHANGE(a,b);
//	printf("%x", a);
//	return 0;
//}

//typedef struct S {
//	char a;
//	int b;
//	char c;
//}S;
//
////将地址0强制类型转化成结构体指针类型，用指针找出成员的地址，因为首地址是0
////所以每个成员的地址即为偏移地址
////这里不访问0地址的数据，只是使用一下地址
//#define OFFSETOF(type,member) (size_t)&(((type*)0)->member)
//
//int main() {
//	//自己编写宏实现offsetof（用于结构体变量相较于首元素的偏移量）
//	printf("%d\n", OFFSETOF(S,a));
//	printf("%d\n", OFFSETOF(S, b));
//	printf("%d\n", OFFSETOF(S, c));
//
//	return 0;
//}

//#define CHANGE(x) (((x&0x55555555)<<1)+((x&0xaaaaaaaa)>>1))
//
//int main() {
//	//写一个宏实现，一个整数奇数位与偶数位的交换
//	//首先分别提取一个整数的奇数位与偶数位
//	//提取后，奇数位左移1个单位，偶数位右移一个单位
//	//相加即可得到交换后的整数
//	int a = 10;
//	a = CHANGE(a);
//	printf("%d\n", a);
//	return 0;
//}